﻿using System;
using System.Data;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using MySql.Data.MySqlClient;
using MySql.Data.Types;
using System.Data.Sql;
using System.Data.SqlClient;

// Espacio de nombres para los contenedores.
namespace GCon
{
    /// <summary>
    /// Clase contenedora de Usuario
    /// </summary>
    public class Con_Usuario
    {
        /// <summary>
        /// Constructor por defecto
        /// </summary>
        public Con_Usuario()
        {
            dPerfilesDeUsuario = new Dictionary<String, Con_Perfil>();
        }

        /// <summary>
        /// Constructor con todos los parametros
        /// </summary>
        /// <param name="ID_PK"></param>
        /// <param name="NOMBRE"></param>
        /// <param name="APELLIDO1"></param>
        /// <param name="APELLIDO2"></param>
        /// <param name="LOGIN"></param>
        public Con_Usuario(String ID_PK, String NOMBRE, String APELLIDO1, String APELLIDO2, String LOGIN, String PSW)
        {
            this._ID_PK = ID_PK;
            this._NOMBRE = NOMBRE;
            this._APELLIDO1 = APELLIDO1;
            this._APELLIDO2 = APELLIDO2;
            this._LOGIN = LOGIN;
            this._PSW = PSW;
            dPerfilesDeUsuario = new Dictionary<String, Con_Perfil>();
        }

        /// <summary>
        /// Constructor de copia
        /// </summary>
        /// <param name="otra"></param>
        public Con_Usuario(Con_Usuario otra)
        {
            this._ID_PK = otra._ID_PK;
            this._NOMBRE = otra._NOMBRE;
            this._APELLIDO1 = otra._APELLIDO1;
            this._APELLIDO2 = otra._APELLIDO2;
            this._LOGIN = otra._LOGIN;
            this._PSW = otra._PSW;
            this.dPerfilesDeUsuario = otra.dPerfilesDeUsuario;
        }

        /// Getters
        public String Get_ID_PK()
        {
            return this._ID_PK;
        }
        public String Get_NOMBRE()
        {
            return this._NOMBRE;
        }
        public String Get_APELLIDO1()
        {
            return this._APELLIDO1;
        }
        public String Get_APELLIDO2()
        {
            return this._APELLIDO2;
        }
        public String Get_LOGIN()
        {
            return this._LOGIN;
        }
        public String Get_PSW()
        {
            return this._PSW;
        }
        /// Setters
        public void Set_ID_PK(String parametro)
        {
            this._ID_PK = parametro;
        }
        public void Set_NOMBRE(String parametro)
        {
            this._NOMBRE = parametro;
        }
        public void Set_APELLIDO1(String parametro)
        {
            this._APELLIDO1 = parametro;
        }
        public void Set_APELLIDO2(String parametro)
        {
            this._APELLIDO2 = parametro;
        }
        public void Set_LOGIN(String parametro)
        {
            this._LOGIN = parametro;
        }
        public void Set_PSW(String parametro)
        {
            this._PSW = parametro;
        }

        /// <summary>
        /// Procedimiento de carga.
        /// Recupera de la BBDD el curso con su login y contraseña
        /// </summary>
        /// <param name="IdUsuario"></param>
        public bool ValidaUsuario(String nombre, String pass)
        {
            MySqlConnection oConexion;
            MySqlDataAdapter oAdaptador;
            DataSet ds;
            //Modificacion 3
            DataTable dt;

            String llamada;
            try
            {

                oConexion = new MySqlConnection();
                oConexion.ConnectionString = "Server=localhost;Database=Meryland;Uid=root;Pwd=root;";
                oConexion.Open();

                llamada = "CALL ValidaUsuario ( '" + nombre + "','" + pass + "'  );";
                oAdaptador = new MySqlDataAdapter(llamada, oConexion);
                //Modificacion 4
                ds = new DataSet("usuario");
                oAdaptador.Fill(ds);

                //Modificacion 3
                dt = new DataTable("usuario");
                oAdaptador.Fill(dt);
                
                //Modificacion 2
                //oAdaptador.Fill(ds);
                // Mi modificacion 1
                //oAdaptador.Fill(ds, "usuario");

                // Original de Millet
                //ds = new DataSet();
                oAdaptador.Fill(ds, "Tabla");

                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    this._ID_PK = dr["USUARIO_ID_PK"].ToString();
                    this._NOMBRE = dr["USUARIO_NOMBRE"].ToString();
                    this._APELLIDO1 = dr["USUARIO_APELLIDO1"].ToString();
                    this._APELLIDO2 = dr["USUARIO_APELLIDO2"].ToString();
                    this._LOGIN = dr["USUARIO_LOGIN"].ToString();
                    this._PSW = dr["USUARIO_PSW"].ToString();
                }

                oConexion.Close();

                // logica de control
                if (this._ID_PK != null)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (MySqlException e)
            {
                ;
                MySqlErrorCode uno = new MySqlErrorCode();
                //throw new NoNullAllowedException(e.Message);
            }
            return false;
        }


        /// <summary>
        /// Procedimiento de carga.
        /// Recupera de la BBDD el curso con Id = IdUsuario.
        /// </summary>
        /// <param name="IdUsuario"></param>
        public void CargaUsuario(int IdUsuario)
        {
            MySqlConnection oConexion;
            MySqlDataAdapter oAdaptador;
            DataSet ds;
            String llamada;

            oConexion = new MySqlConnection();
            oConexion.ConnectionString = "Server=localhost;Database=MERYLAND;Uid=root;Pwd=MERYLAND;";
            oConexion.Open();

            llamada = "CALL CargaUsuario ( '" + IdUsuario + "' );";
            oAdaptador = new MySqlDataAdapter(llamada, oConexion);
            ds = new DataSet();
            oAdaptador.Fill(ds, "Tabla");

            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                this._ID_PK = dr["USUARIO_ID_PK"].ToString();
                this._NOMBRE = dr["USUARIO_NOMBRE"].ToString();
                this._APELLIDO1 = dr["USUARIO_APELLIDO1"].ToString();
                this._APELLIDO2 = dr["USUARIO_APELLIDO2"].ToString();
                this._LOGIN = dr["USUARIO_LOGIN"].ToString();
                this._PSW = dr["USUARIO_PSW"].ToString();
            }

            oConexion.Close();
        }

        /// <summary>
        /// Procedimiento de inserción.
        /// Inserta en la BBDD un Usuario.
        /// </summary>
        public void InsertaUsuario()
        {
            MySqlConnection oConexion;
            MySqlCommand oComando;
            String llamada;

            oConexion = new MySqlConnection();
            oConexion.ConnectionString = "Server=localhost;Database=MERYLAND;Uid=root;Pwd=MERYLAND;";

            llamada = "CALL InsertaUsuario ( '" + this._NOMBRE + "','" + this._APELLIDO1 + "','" + this._APELLIDO2 + "','" + this._LOGIN + "','" + this._PSW + "' );";
            oComando = new MySqlCommand(llamada, oConexion);

            oConexion.Open();
            oComando.ExecuteReader();

            oConexion.Close();
        }

        /// <summary>
        /// Procedimiento de modificación.
        /// Modifica en la BBDD un Usuario.
        /// </summary>
        public void ModificaUsuario()
        {
            MySqlConnection oConexion;
            MySqlCommand oComando;
            String llamada;

            oConexion = new MySqlConnection();
            oConexion.ConnectionString = "Server=localhost;Database=MERYLAND;Uid=root;Pwd=MERYLAND;";

            llamada = "CALL ModificaUsuario ( '" + this._ID_PK + "','" + this._NOMBRE + "','" + this._APELLIDO1 + "','" + this._APELLIDO2 + "','" + this._LOGIN + "','" + this._PSW + "' );";
            oComando = new MySqlCommand(llamada, oConexion);

            oConexion.Open();
            oComando.ExecuteReader();

            oConexion.Close();
        }

        /// <summary>
        /// Procedimiento de eliminación.
        /// Elimina de la BBDD un Usuario.
        /// </summary>
        public void EliminaUsuario()
        {
            MySqlConnection oConexion;
            MySqlCommand oComando;
            String llamada;

            oConexion = new MySqlConnection();
            oConexion.ConnectionString = "Server=localhost;Database=MERYLAND;Uid=root;Pwd=MERYLAND;";

            llamada = "CALL EliminaUsuario ( '" + this._ID_PK + "' );";
            oComando = new MySqlCommand(llamada, oConexion);

            oConexion.Open();
            oComando.ExecuteReader();

            oConexion.Close();
        }
        
        ///Procedimientos para perfiles de Usuario
        public void ListaPerfilesDeUsuario()
        {
            MySqlConnection oConexion;
            MySqlDataAdapter oAdaptador;
            DataSet ds;
            String llamada;
            Con_Perfil oPerfilDeUsuario;

            oConexion = new MySqlConnection();
            oConexion.ConnectionString = "Server=localhost;Database=MERYLAND;Uid=root;Pwd=MERYLAND;";
            oConexion.Open();

            llamada = "CALL ListaPerfilesDeUsuario( " + this._ID_PK + " )";
            oAdaptador = new MySqlDataAdapter(llamada, oConexion);
            ds = new DataSet();
            oAdaptador.Fill(ds, "Tabla");

            foreach (DataRow dr in ds.Tables[0].Rows)
            {

                oPerfilDeUsuario = new Con_Perfil(dr["PERFIL_ID_PK"].ToString(), dr["PERFIL_NOMBRE"].ToString(), dr["PERFIL_DESCRIPCION"].ToString());
                dPerfilesDeUsuario.Add(oPerfilDeUsuario.Get_ID_PK(), oPerfilDeUsuario);
                oPerfilDeUsuario = null;

            }

            oConexion.Close();
        }

        public Con_Perfil GetPerfilDeUsuario(String Id)
        {
            return this.dPerfilesDeUsuario[Id];
        }

        public int cuentaPerfilesDeUsuario()
        {
            return this.dPerfilesDeUsuario.Count;
        }

        /// Atributos
        private String _ID_PK;
        private String _LOGIN;
        private String _PSW;
        private String _NOMBRE;
        private String _APELLIDO1;
        private String _APELLIDO2;

        private Dictionary<String, Con_Perfil> dPerfilesDeUsuario;
       }
}
